From: Keir Fraser Date: Fri, 21 Aug 2009 16:14:35 +0000 (+0100) Subject: x86: Ensure irq is disabled before taking vector_lock. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13430 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=2db97700d4b64790a80e086bfa161f549cc2d946;p=xen.git x86: Ensure irq is disabled before taking vector_lock. Fixed debug lock issue for taking vector lock. Signed-off-by: Xiantao Zhang --- diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index ea7f8b2fa4..bc9ecd90cb 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -379,6 +379,7 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask) struct irq_cfg *cfg; unsigned int irq; int ret; + unsigned long flags; cpumask_t dest_mask; if (!cpus_intersects(mask, cpu_online_map)) @@ -386,11 +387,13 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask) irq = desc->irq; cfg = desc->chip_data; - - lock_vector_lock(); + + local_irq_save(flags); + lock_vector_lock(); ret = __assign_irq_vector(irq, cfg, mask); unlock_vector_lock(); - + local_irq_restore(flags); + if (ret < 0) return BAD_APICID; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index c1105802e3..1f5e1a666d 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -55,6 +55,7 @@ DEFINE_PER_CPU(vector_irq_t, vector_irq) = { DEFINE_PER_CPU(struct cpu_user_regs *, __irq_regs); +/* Must be called when irq disabled */ void lock_vector_lock(void) { /* Used to the online set of cpus does not change